package veterinario;

import java.io.Serializable;
import java.util.ArrayList;

/** Classe que define um Cliente com identificador único e uma lista dos animais que possui.
 *
 * @author 2011101993 - Hugo Amaro
 * @author 2006130415 - Jorge Martins Alves
 */
public class Cliente extends Pessoa implements Serializable {
	private int _id;
        /**
         * @param _animais  ArrayList onde se colocam todos os animais que o cliente possui.
         */
        public ArrayList<Animal> _animais = new ArrayList<Animal>();
        
        /** Único construtor desta classe, que recebe o nome do cliente e a lista dos seus animais.
         * 
         * @param nome  texto com o nome do cliente.
         * @param animais   ArrayList onde se colocam todos os animais que o cliente possui.
         */
        public Cliente(String nome, ArrayList<Animal> animais){
            super(nome);
            this._animais.addAll(animais);
        }

        /** Método para adicionar um animal à lista de animais do cliente.
         * 
         * @param aAnim objecto Animal com um animal já definido.
         */
        public void addAnimal(Animal aAnim) {
		this._animais.add(aAnim);
	}

        /** Método para remover um animal da lista do cliente.
         * 
         * @param aAnim objecto Animal com um animal já definido.
         * @return  true se removeu o animal pretendido.
         */
        public boolean deleteAnimal(Animal aAnim) {
		return this._animais.remove(aAnim);
	}

        /** Método que procura por todos os animais de uma determinada raça na lista de todos os animais do cliente e devolve o array com o que encontrou.
         * 
         * @param aRaca texto com a espécie do animal: gato, cão, vaca, etc.
         * @return  array com todos os animais de uma determinada raça que encontrou na lista de animais do cliente.
         */
        public Animal[] listRaca(String aRaca) {
		ArrayList<Animal> tempAnimais = new ArrayList<Animal>();
                for(int i=0; i<this._animais.size(); i++){
                    if(this._animais.get(i).getRaca().equalsIgnoreCase(aRaca))
                        tempAnimais.add(this._animais.get(i));
                }
                Animal[] retAnimais = new Animal[tempAnimais.size()];
                return tempAnimais.toArray(retAnimais);
	}

        /** Método que procura por todos os animais de estimação na lista de todos os animais do cliente e devolve o array com o que encontrou.
         * 
         * @return  array com todos os animais de estimação que encontrou na lista de animais do cliente.
         */
        public Animal[] listPets() {
		ArrayList<Animal> tempAnimais = new ArrayList<Animal>();
                for(int i=0; i<this._animais.size(); i++){
                    if(this._animais.get(i).getClass()==Estimacao.class)
                        tempAnimais.add(this._animais.get(i));
                }
                Animal[] retAnimais = new Animal[tempAnimais.size()];
                return tempAnimais.toArray(retAnimais);
	}

        /** Método que procura por todos os animais de estimação com um determinado nome na lista de todos os animais do cliente e devolve o array com o que encontrou.
         * 
         * @param name  texto com o nome do animal.
         * @return  array com todos os animais de estimação com determinado nome que encontrou na lista de animais do cliente.
         */
        public Animal[] listPetsByName(String name) {
		ArrayList<Animal> tempAnimais = new ArrayList<Animal>();
                for(int i=0; i<this._animais.size(); i++){
                    if(this._animais.get(i).getClass()==Estimacao.class&&((Estimacao)this._animais.get(i)).getNome().equalsIgnoreCase(name))
                        tempAnimais.add(this._animais.get(i));
                }
                Animal[] retAnimais = new Animal[tempAnimais.size()];
                return tempAnimais.toArray(retAnimais);
	}

        /** Método que procura por todos os animais de criação na lista de todos os animais do cliente e devolve o array com o que encontrou.
         * 
         * @return  array com todos os animais de criação que encontrou na lista de animais do cliente.
         */
        public Animal[] listCriacao() {
		ArrayList<Animal> tempAnimais = new ArrayList<Animal>();
                for(int i=0; i<this._animais.size(); i++){
                    if(this._animais.get(i).getClass()==Criacao.class)
                        tempAnimais.add(this._animais.get(i));
                }
                Animal[] retAnimais = new Animal[tempAnimais.size()];
                return tempAnimais.toArray(retAnimais);
	}

        /** Método que procura por todos os animais de criação com determinada origem na lista de todos os animais do cliente e devolve o array com o que encontrou.
         * 
         * @param aOrigem   texto com o local de origem do animal.
         * @return  array com todos os animais de criação com determinada origem que encontrou na lista de animais do cliente.
         */
        public Animal[] listCriacaoByOrigem(String aOrigem) {
		ArrayList<Animal> tempAnimais = new ArrayList<Animal>();
                for(int i=0; i<this._animais.size(); i++){
                    if(this._animais.get(i).getClass()==Criacao.class&&((Criacao)this._animais.get(i)).getOrigem().equalsIgnoreCase(aOrigem))
                        tempAnimais.add(this._animais.get(i));
                }
                Animal[] retAnimais = new Animal[tempAnimais.size()];
                return tempAnimais.toArray(retAnimais);
	}

        /** Método set para definir o identificador único do cliente.
         * 
         * @param aId   identificador único do cliente, um inteiro positivo.
         */
        public void setId(int aId) {
		this._id = aId;
	}

        /** Método get que devolve o identificador único do cliente.
         * 
         * @return  identificador único do cliente, um inteiro positivo.
         */
        public int getId() {
		return this._id;
	}

        /** Método get que devolve lista dos animais do cliente.
         * 
         * @return  ArrayList com todos os animais que o cliente possui.
         */
        public ArrayList<Animal> getAnimais() {
		return this._animais;
	}
        

        /** Método "toString" do cliente.
         * 
         * @return  String com o identificador único e o nome do cliente.
         */
        public String listaString(){
            return "Id: "+this.getId()+" Nome: "+this.getNome();
        }
}